// import './index.less'
// 定义食物类
var Food = /** @class */ (function () {
    function Food() {
        this.element = document.getElementById('food'); //不可能为空 +!
    }
    Object.defineProperty(Food.prototype, "X", {
        // 获取食物X轴坐标方法
        get: function () {
            return this.element.offsetLeft;
        },
        enumerable: false,
        configurable: true
    });
    Object.defineProperty(Food.prototype, "Y", {
        // 获取食物y轴坐标方法
        get: function () {
            return this.element.offsetTop;
        },
        enumerable: false,
        configurable: true
    });
    // 修改食物位置 随机生成 0-290 蛇移动一次就是一格10像素
    Food.prototype.change = function () {
        // round 四舍五入 floor向下取整 Math.floor( Math.random() * 30 ) * 10
        var top = Math.round(Math.random() * 29) * 10;
        var left = Math.round(Math.random() * 29) * 10;
        this.element.style.left = left + 'px';
        this.element.style.top = top + 'px';
    };
    return Food;
}());
// 定义积分牌类
var ScorePanel = /** @class */ (function () {
    function ScorePanel(maxLevel, upScore) {
        if (maxLevel === void 0) { maxLevel = 10; }
        if (upScore === void 0) { upScore = 10; }
        this.score = 0;
        this.level = 1;
        this.scoreEle = document.getElementById('score');
        this.levelEle = document.getElementById('level');
        this.maxLevel = maxLevel;
        this.upScore = upScore;
    }
    // 加分方法
    ScorePanel.prototype.addScore = function () {
        this.score++;
        this.scoreEle.innerHTML = this.score + '';
        // 判断分数是多少
        if (this.score % this.upScore === 0) {
            this.levelUp();
        }
    };
    // 升级方法
    ScorePanel.prototype.levelUp = function () {
        if (this.level < this.maxLevel) {
            this.levelEle.innerHTML = ++this.level + '';
        }
    };
    return ScorePanel;
}());
// 定义蛇类
var Snake = /** @class */ (function () {
    function Snake() {
        this.element = document.getElementById('snake');
        this.head = document.querySelector('#snake>div');
        this.bodies = this.element.getElementsByTagName('div');
    }
    Object.defineProperty(Snake.prototype, "X", {
        // 获取蛇头坐标
        get: function () {
            return this.head.offsetLeft;
        },
        // 设置蛇头坐标
        set: function (value) {
            // 新值旧值相同，直接返回
            if (this.X === value) {
                return;
            }
            // 蛇撞墙
            if (value < 0 || value > 290) {
                throw new Error('蛇撞墙了!');
            }
            // 修改x是在修改水平坐标蛇在左右移动 蛇向左则不能向右掉头
            if (this.bodies[1] && this.bodies[1].offsetLeft === value) {
                // 如果发生掉头，让蛇向反方向继续移动
                if (value > this.X) {
                    value = this.X - 10;
                }
                else {
                    value = this.X + 10;
                }
            }
            // 移动身体
            this.moveBody();
            this.head.style.left = value + 'px';
            // 检查撞到自己
            // this.checkHeadBody()
        },
        enumerable: false,
        configurable: true
    });
    Object.defineProperty(Snake.prototype, "Y", {
        get: function () {
            return this.head.offsetTop;
        },
        set: function (value) {
            // 新值旧值相同，直接返回
            if (this.Y === value) {
                return;
            }
            if (value < 0 || value > 290) {
                throw new Error('蛇撞墙了!');
            }
            // 修改y是在修改垂直坐标蛇在上下移动 蛇向上则不能向下掉头
            if (this.bodies[1] && this.bodies[1].offsetLeft === value) {
                // 如果发生掉头，让蛇向反方向继续移动
                if (value > this.Y) {
                    value = this.Y - 10;
                }
                else {
                    value = this.Y + 10;
                }
            }
            // 移动身体
            this.moveBody();
            this.head.style.top = value + 'px';
            // 检查撞到自己
            // this.checkHeadBody()
        },
        enumerable: false,
        configurable: true
    });
    // 蛇加身体
    Snake.prototype.addBody = function () {
        // 向element中添加div
        this.element.insertAdjacentHTML('beforeend', '<div></div>');
    };
    // 蛇身体移动方法
    Snake.prototype.moveBody = function () {
        // 将后边身体设置为前边身体位置
        // 遍历获取所有身体
        for (var i = this.bodies.length - 1; i > 0; i--) {
            // 获取前边身体位置
            var X = this.bodies[i - 1].offsetLeft;
            var Y = this.bodies[i - 1].offsetTop;
            // 设置到当前身体
            this.bodies[i].style.left = X + 'px';
            this.bodies[i].style.top = Y + 'px';
        }
    };
    return Snake;
}());
// 游戏控制类
var GameControl = /** @class */ (function () {
    function GameControl() {
        // 按键方向
        this.direction = '';
        // 记录游戏是否结束
        this.isLive = true;
        this.snake = new Snake();
        this.food = new Food();
        this.scorePanel = new ScorePanel();
        this.init();
    }
    // 游戏初始化
    GameControl.prototype.init = function () {
        document.addEventListener('keydown', this.keydownHandler.bind(this));
        // 调用run方法 使蛇移动
        this.run();
    };
    // 键盘按下响应函数
    GameControl.prototype.keydownHandler = function (event) {
        this.direction = event.key;
    };
    // 控制蛇移动方法
    GameControl.prototype.run = function () {
        // 根据方向this.direction来使蛇位置变更
        // 获取蛇现在坐标
        var X = this.snake.X;
        var Y = this.snake.Y;
        // 根据按键方向修改坐标
        switch (this.direction) {
            case "ArrowUp":
            case "w":
                Y -= 10;
                break;
            case "ArrowDown":
            case "s":
                Y += 10;
                break;
            case "ArrowLeft":
            case "a":
                X -= 10;
                break;
            case "ArrowRight":
            case "d":
                X += 10;
                break;
        }
        // 检查蛇是否吃到食物
        this.checkEat(X, Y);
        try {
            // 修改蛇坐标
            this.snake.X = X;
            this.snake.Y = Y;
        }
        catch (e) {
            // 出现异常 游戏结束
            alert(e.message + ' GAME OVER');
            // 将isLive设置为flase
            this.isLive = false;
        }
        // 开启定时调用
        this.isLive && setTimeout(this.run.bind(this), 300 - (this.scorePanel.level - 1) * 30);
    };
    // 检查蛇是否吃到食物方法
    GameControl.prototype.checkEat = function (X, Y) {
        if (X === this.food.X && Y === this.food.Y) {
            // 食物位置变化
            this.food.change();
            // 分数增加
            this.scorePanel.addScore();
            // 蛇增加一节
            this.snake.addBody();
        }
    };
    return GameControl;
}());
var gameControl = new GameControl();
// setInterval(()=>{
//   console.log(gameControl.direction);
// },1000)
